(function() {
    window.Block = function() {
        // 测试：写死方块
        // this.block = [
        //     [0, 1, 1, 0],
        //     [1, 1, 0, 0],
        //     [0, 0, 0, 0],
        //     [0, 0, 0, 0]
        // ];

        // 得到随机的方块
        // 第一步：罗列所有的类型
        let allType = ["S", "T", "O", "L", "J", "I", "Z"];

        // 第二步从所有的类型中随机得到一种
        this.type = allType[parseInt(Math.random() * allType.length)];
        // console.log(this.type);


        // 第三步：得到随机类型的类型方块，然后通过这个类型获取当前的类型所有形态的总数量，
        // 因为不同的类型，形状数量不同，比如O只有一种，I只有两种
        // block[this.type]随机获取形态数组
        this.allDir = block[this.type].length;
        // console.log(this.allDir);

        // 第四步：通过当前的allDir的length随机得到不同的方向数字
        this.dir = parseInt(Math.random() * this.allDir);
        // console.log(this.dir);

        // 第五步得到随机的方块  this.type：方块形态  this.dir：方块方向
        this.code = block[this.type][this.dir];
        // console.log(this.code);


        // 初始的行
        this.row = 0;
        // 初始的列，因为要居中显示，所以列为4
        this.col = 4;
    };
    Block.prototype.render = function() {
        // 渲染四行四列的方块;
        for (let i = 0; i < 4; i++) {
            for (let j = 0; j < 4; j++) {
                // console.log(this.code);
                // 如果四乘四的矩阵中某一项不是0，就说明有颜色，渲染这个颜色
                if (this.code[i][j] !== 0) {
                    game.setColor(i + this.row, j + this.col, this.code[i][j]);
                }
            }
        }
    };

    Block.prototype.check = function(row, col) {
        // check函数的row和col指的是要校验地图的row和col位置
        // 能力判断方法，判断的是对应位置的方块和地图是否都不为0的情况，
        // 如果有返回false，否则返回false，false代表没有重合
        for (let i = 0; i < 4; i++) {
            for (let j = 0; j < 4; j++) {
                if (this.code[i][j] != 0 && game.map.mapCode[i + row][j + col] !== 0) {
                    return false;
                }
            }
        }
        return true;
    }

    // 方块下落，需要判断当前的方块是否能够下落
    Block.prototype.checkDown = function() {
        // 判断当前地图的位置和自己的方块位置是否有重合
        // this.row+1指的是预判断
        // 预判断就是在下一次方块将要到达的位置是否有对应的地图不为0
        if (this.check(this.row + 1, this.col)) {
            this.row++;
        } else {
            // 此时就是方块下落到低的状态，渲染预览框的方块
            game.blocks = game.nextBlock;
            // 让预览框再次渲染新的
            game.nextBlock = new Block();
            //方块到底了，然后渲染到地图的code上
            this.renderMap();
            // 判断是否可以消行
            game.map.checkRemove();
            // 进行判断是否游戏结束
            this.checkOver();
        }
    }

    // 判断是否能够向左移动，如果可以则移动
    Block.prototype.checkLeft = function() {
            // 判断是否可以向左，需要预判断
            if (this.check(this.row, this.col - 1)) {
                this.col--;
            }
        }
        // 判断是否能够向右移动，如果可以则移动
    Block.prototype.checkRight = function() {
        // 判断是否可以向右
        if (this.check(this.row, this.col + 1)) {
            this.col++;
        }
    }

    // 方块一键到底
    Block.prototype.checkBlockEnd = function() {
        // 使用while循环，如果当前的check返回的时+是true则代表能够下移，继续让row++
        while (this.check(this.row + 1, this.col)) {
            this.row++;
        }
    }

    // 方块的旋转
    Block.prototype.checkRot = function() {
        // 备份旧的方块
        let oldDir = this.dir
            // 改变新的
        this.dir++;
        // 判断当前dir大于最后一种方向，回到第一种状态
        if (this.dir > this.allDir - 1) {
            this.dir = 0
        }
        // 改变方向之后渲染新的方向
        this.code = block[this.type][this.dir]
            // 渲染之后的新方块需要判断，是否右能力进行渲染
        if (!this.check(this.row, this.col)) {
            // 进入这里说明重合了，违规了，打回原形
            this.dir = oldDir;
            // 再次渲染方块
            this.code = block[this.type][this.dir]
        }
    }

    // 将已经到底的方块渲染到地图上
    Block.prototype.renderMap = function() {
        for (let i = 0; i < 4; i++) {
            for (let j = 0; j < 4; j++) {
                // 将现在已有的方块渲染到Map类的mapCode
                if (this.code[i][j] !== 0) {
                    game.map.mapCode[this.row + i][this.col + j] = this.code[i][j]
                }
            }
        }
    }

    Block.prototype.checkOver = function() {
        for (let i = 0; i < game.col; i++) {
            if (game.map.mapCode[0][i] != 0) {
                clearInterval(game.timer);
                alert('游戏结束,您当前得分为' + game.score)
            }
        }
    }

})()